home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / ddj0492.zip / DRMDOS.ASC < prev    next >
Text File  |  1992-03-10  |  21KB  |  491 lines

  1. _MULTIUSER DOS FOR CONTROL SYSTEMS: PART I_
  2. by Richard Kryszak
  3.  
  4. [LISTING ONE]
  5.  
  6. /* file name: system.c */
  7.  
  8. #include <dos.h>
  9. #include "queues.h"
  10. #include <stdio.h>
  11.  
  12. /*===============*/
  13. /* local defines */
  14. /*===============*/
  15. #define CCPM        0xE0        /* cdos call int value */
  16. #define C_DETACH    0x93        /* console detach CL register value */
  17. #define P_DELAY     0x8D        /* process delay CL register value */
  18. #define P_DISPATCH  0x8E        /* process dispatch CL register value */
  19. #define P_PRIOR     0x91        /* process priority CL register value */
  20. #define Q_CREAD     0x8A        /* queue cread CL register value */
  21. #define Q_CWRITE    0x8C        /* queue cwrite CL register value */
  22. #define Q_MAKE      0x86        /* queue make CL register value */
  23. #define Q_OPEN      0x87        /* queue open CL register value */
  24. #define Q_READ      0x89        /* queue read CL register value */
  25. #define Q_WRITE     0x8B        /* queue write CL register value */
  26. #define S_MEMORY    0x59        /* system memory allocation request */
  27.  
  28. /*=====================*/
  29. /* function prototypes */
  30. /*=====================*/
  31. unsigned int c_detach(void);
  32. void p_dispatch(void);
  33. void p_priority(unsigned char data);
  34. void p_delay(unsigned int del);
  35. unsigned int far *  s_memory(int mem_size);
  36. int q_make(struct q_descriptor *descript_ptr,
  37.        unsigned int msg_length,
  38.        unsigned int num_msg,
  39.        char que_name[8],
  40.        int *err_ptr);
  41. int q_open(struct q_parameter_blk *param_blk_ptr,
  42.        char que_name[8],
  43.        int *err_ptr);
  44. int q_read(struct q_parameter_blk *param_blk_ptr,
  45.        unsigned char *buff_ptr,
  46.        int *err_ptr);
  47. int q_write(struct q_parameter_blk *param_blk_ptr,
  48.         unsigned char *buff_ptr,
  49.         int *err_ptr);
  50. int q_cread(struct q_parameter_blk *param_blk_ptr,
  51.         unsigned char *buff_ptr,
  52.         int *err_ptr);
  53. int q_cwrite(struct q_parameter_blk *param_blk_ptr,
  54.          unsigned char *buff_ptr,
  55.          int *err_ptr);
  56.  
  57. /*======================*/
  58. /* function definitions */
  59. /*======================*/
  60. unsigned int c_detach()
  61.    { union REGS inregs,outregs;
  62.  
  63.      inregs.h.cl = C_DETACH;                    /* detach function call */
  64.      int86(CCPM,&inregs,&outregs);              /* call cdos */
  65.      return(outregs.x.ax);                      /* return call status */
  66.    }
  67. void p_dispatch()
  68.    { union  REGS inregs,outregs;
  69.  
  70.      inregs.h.cl = P_DISPATCH;                  /* dispatch function call */
  71.      int86(CCPM,&inregs,&outregs);              /* call cdos */
  72.    }
  73. void p_priority(unsigned char priority)
  74.    { union REGS inregs,outregs;
  75.  
  76.      inregs.h.cl = P_PRIOR;                     /* priority change call */
  77.      inregs.h.dl = priority;                    /* desired priority */
  78.      int86(CCPM,&inregs,&outregs);              /* call cdos */
  79.    }
  80. void p_delay(unsigned int del)
  81.    { union  REGS inregs,outregs;
  82.      inregs.h.cl = P_DELAY;                     /* delay function call */
  83.      inregs.x.dx = del;                         /* number of ticks */
  84.      int86(CCPM,&inregs,&outregs);              /* call cdos */
  85.    }
  86. unsigned int far * s_memory(int mem_size)
  87.    { union  REGS inregs,outregs;
  88.      struct SREGS seg_regs;                     /* segment registers */
  89.      unsigned int _far *mem_ptr=NULL;           /* pointer to memory block */
  90.      mem_size *= 2;                             /* compute # of bytes */
  91.      inregs.h.cl = S_MEMORY;                    /* system memory allocation */
  92.      inregs.x.dx = mem_size;                    /* # of bytes requested */
  93.      int86x(CCPM,&inregs,&outregs,&seg_regs);   /* call cdos */
  94.      if(outregs.x.ax == 0xFFFF)                 /* if not successful */
  95.     { return(NULL);                         /* return a null pointer */
  96.     }
  97.      mem_ptr = (unsigned int far *)
  98.             ((0x10000 * seg_regs.es)
  99.              + outregs.x.ax);           /* convert into a pointer */
  100.      return(mem_ptr);                           /* return the pointer */
  101.    }
  102. int q_make(struct q_descriptor *descript_ptr,
  103.        unsigned int msg_length,
  104.        unsigned int num_msg,
  105.        char que_name[8],
  106.        int *err_ptr)
  107.    { int int86_error;                           /* return status */
  108.      int i;                                     /* index variable */
  109.      union REGS inregs, outregs;                /* processor registers */
  110.      struct SREGS seg_regs;                     /* segment registers */
  111.      segread(&seg_regs);                        /* read segment registers */
  112.      descript_ptr->internal_1 = 0;              /* must be 0 */
  113.      descript_ptr->internal_2 = 0;              /* must be 0 */
  114.      descript_ptr->internal_3 = 0;              /* must be 0 */
  115.      descript_ptr->internal_4 = 0;              /* must be 0 */
  116.      descript_ptr->internal_5 = 0;              /* must be 0 */
  117.      descript_ptr->internal_6 = 0;              /* must be 0 */
  118.      descript_ptr->msglen = msg_length;         /* add message length */
  119.      descript_ptr->nmsgs = num_msg;             /* add number of messages */
  120.      descript_ptr->flags = 0;                   /* no flags used */
  121.      for(i = 0; i < 8;  ++i)                    /* copy queue name */
  122.     { descript_ptr->name[i]=que_name[i];
  123.     }
  124.      descript_ptr->buffer = 0;                  /* buffer in system area */
  125.      inregs.h.cl = Q_MAKE;                      /* queue make call */
  126.      inregs.x.dx = FP_OFF(descript_ptr);        /* put offset into dx */
  127.      int86_error=int86x(CCPM,&inregs,
  128.             &outregs,&seg_regs);    /* call cdos */
  129.      *err_ptr = outregs.x.cx;                   /* write error code */
  130.      return(int86_error);                       /* int86 return status */
  131.    }
  132. int q_open(struct q_parameter_blk *param_blk_ptr,
  133.        char que_name[8],
  134.        int *err_ptr)
  135.    { int int86_error;                           /* return status */
  136.      int i;                                     /* index variable */
  137.      union REGS inregs, outregs;                /* processor registers */
  138.      struct SREGS seg_regs;                     /* segment registers */
  139.      segread(&seg_regs);                        /* read segment registers */
  140.      param_blk_ptr->internal_1 = 0;             /* must be 0 */
  141.      param_blk_ptr->internal_2 = 0;             /* must be 0 */
  142.      for(i = 0; i < 8;  ++i)
  143.     { param_blk_ptr->name[i] = que_name[i]; /* copy queue name */
  144.     }
  145.      inregs.h.cl = Q_OPEN;                      /* q_open call */
  146.      inregs.x.dx = FP_OFF(param_blk_ptr);       /* put offset into dx */
  147.      int86_error=int86x(CCPM,&inregs,
  148.             &outregs,&seg_regs);    /* call cdos */
  149.      *err_ptr = outregs.x.cx;                   /* write error code */
  150.      return(int86_error);                       /* int86 return status */
  151.    }
  152. int q_write(struct q_parameter_blk *param_blk_ptr,
  153.         unsigned char *buff_ptr,
  154.         int *err_ptr)
  155.    { int int86_error;                           /* return status */
  156.      union REGS inregs, outregs;                /* processor registers */
  157.      struct SREGS seg_regs;                     /* segment registers */
  158.      segread(&seg_regs);                        /* read segment registers */
  159.      param_blk_ptr->buffer=FP_OFF(buff_ptr);    /* pointer to the buffer */
  160.      inregs.h.cl = Q_WRITE;                     /* q_write call */
  161.      inregs.x.dx = FP_OFF(param_blk_ptr);       /* put offset into dx */
  162.      int86_error=int86x(CCPM,&inregs, &outregs,&seg_regs);    /* call cdos */
  163.      *err_ptr = outregs.x.cx;                   /* write error code */
  164.      return(int86_error);                       /* int86 return status */
  165.    }
  166. int q_read(struct q_parameter_blk *param_blk_ptr,
  167.        unsigned char *buff_ptr,
  168.        int *err_ptr)
  169.    { unsigned int int86_error;                  /* return status */
  170.      union REGS inregs, outregs;                /* processor registers */
  171.      struct SREGS seg_regs;                     /* segment registers */
  172.      segread(&seg_regs);                        /* read segment registers */
  173.      param_blk_ptr->buffer=FP_OFF(buff_ptr);    /* pointer to the buffer */
  174.      inregs.h.cl = Q_READ;                      /* q_read call */
  175.      inregs.x.dx = FP_OFF(param_blk_ptr);       /* put offset into dx */
  176.      int86_error=int86x(CCPM,&inregs,&outregs,&seg_regs); /* int86 call */
  177.      *err_ptr = outregs.x.cx;                   /* write error code */
  178.      return(int86_error);                       /* int86 return status */
  179.    }
  180. int q_cwrite(struct q_parameter_blk *param_blk_ptr,unsigned char *buff_ptr,
  181.                                                                  int *err_ptr)
  182.    { int int86_error;                           /* return status */
  183.      union REGS inregs, outregs;                /* processor registers */
  184.      struct SREGS seg_regs;                     /* segment registers */
  185.      segread(&seg_regs);                        /* read segment registers */
  186.      param_blk_ptr->buffer=FP_OFF(buff_ptr);    /* pointer to the buffer */
  187.      inregs.h.cl = Q_CWRITE;                    /* q_write call */
  188.      inregs.x.dx = FP_OFF(param_blk_ptr);       /* put offset into dx */
  189.      int86_error=int86x(CCPM,&inregs,&outregs,&seg_regs);    /* call cdos */
  190.      *err_ptr = outregs.x.cx;                   /* write error code */
  191.      return(int86_error);                       /* int86 return status */
  192.    }
  193. int q_cread(struct q_parameter_blk *param_blk_ptr,unsigned char *buff_ptr,
  194.                                                         int *err_ptr)
  195.    { int int86_error;                           /* return status */
  196.      union REGS inregs, outregs;                /* processor registers */
  197.      struct SREGS seg_regs;                     /* segment registers */
  198.      segread(&seg_regs);                        /* read segment registers */
  199.      param_blk_ptr->buffer=FP_OFF(buff_ptr);    /* pointer to the buffer */
  200.      inregs.h.cl = Q_CREAD;                     /* q_cread call */
  201.      inregs.x.dx = FP_OFF(param_blk_ptr);       /* put offset into dx */
  202.      int86_error=int86x(CCPM,&inregs,&outregs,&seg_regs);    /* call cdos */
  203.      *err_ptr = outregs.x.cx;                   /* write error */
  204.      return(int86_error);                       /* int86 return status */
  205.    }
  206.  
  207.  
  208.  
  209. [LISTING TWO]
  210.  
  211. /* file name: queues.h */
  212.  
  213. struct q_descriptor
  214. { unsigned int internal_1;      /* for internal use ; must be zero */
  215.   unsigned int internal_2;      /* for internal use ; must be zero */
  216.   int flags;                    /* for internal use ; queue flags */
  217.   char name[8];                 /* queue name */
  218.   int msglen;                   /* number of bytes in each logical message */
  219.   int nmsgs;                    /* maximum number of messages supported */
  220.   unsigned int  internal_3;     /* for internal use ; must be zero */
  221.   unsigned int  internal_4;     /* for internal use ; must be zero */
  222.   unsigned int  internal_5;     /* for internal use ; must be zero */
  223.   unsigned int  internal_6;     /* for internal use ; must be zero */
  224.   unsigned int  buffer;         /* address of the queue buffer */
  225.  };
  226.  
  227. struct q_parameter_blk
  228. { unsigned int internal_1;      /* for internal use ; must be zero */
  229.   int queueid;                  /* queue number field ; filled by q_open */
  230.   unsigned int internal_2;      /* for internal use ; must be zero */
  231.   unsigned int buffer;          /* offset of queue message buffer */
  232.   char name[8];                 /* queue name */
  233.  };
  234.  
  235.  
  236.  
  237.  
  238. [LISTING THREE]
  239.  
  240. /* file name: database.c */
  241.  
  242. #include <stdio.h>
  243. #include "queues.h"
  244.  
  245. /*=====================*/
  246. /* function prototypes */
  247. /*=====================*/
  248. void main(void);
  249.  
  250. /*===============*/
  251. /* local defines */
  252. /*===============*/
  253. #define Q_DEPTH         1               /* queue contains 1 message */
  254. #define DBASE_SIZE      2048            /* size of the database */
  255. #define TRUE            1
  256.  
  257. /*================================*/
  258. /* external function declarations */
  259. /*================================*/
  260. extern unsigned int c_detach(void);
  261. extern void p_delay(unsigned int del);
  262. extern unsigned int far *s_memory(int mem_size);
  263. extern int q_make(struct q_descriptor *descript_ptr,
  264.           unsigned int msg_length,
  265.           unsigned int num_msg,
  266.           char que_name[8],
  267.           int *err_ptr);
  268. extern int q_open(struct q_parameter_blk *param_blk_ptr,
  269.           char que_name[8],
  270.           int *err_ptr);
  271. extern int q_write(struct q_parameter_blk *param_blk_ptr,
  272.            unsigned char *buff_ptr,
  273.            int *err_ptr);
  274. /*=====================*/
  275. /* function definition */
  276. /*=====================*/
  277. void main()
  278.    { int result;                                /* result of q_make */
  279.      int error_type;                            /* cdos return code */
  280.      union base
  281.     { unsigned int far *base_ptr;
  282.       unsigned char base[sizeof(unsigned int far *)];
  283.     }base_union;                             /* composite pointer */
  284.      struct q_descriptor dbase_descript;         /* descriptor block */
  285.      struct q_parameter_blk dbase_parameters;    /* parameter block */
  286.      base_union.base_ptr = s_memory(DBASE_SIZE); /* request system memory */
  287.      if(base_union.base_ptr == NULL)             /* if NULL pointer */
  288.     { puts("No System Memory Available");    /* print an error message */
  289.       exit(-1);                              /* exit, memory error */
  290.     }
  291.      result = q_make(&dbase_descript,            /* pointer to descriptor */
  292.              sizeof(base_union),         /* length of messages */
  293.               Q_DEPTH,               /* number of messages */
  294.               "database",            /* queue name */
  295.               &error_type);          /* error return */
  296.       result = q_open(&dbase_parameters,     /* pointer to parameter */
  297.               "database",            /* queue name */
  298.               &error_type);          /* error return */
  299.       result = q_cwrite(&dbase_parameters,   /* write to queue */
  300.                 &base_union.base[0], /* pointer to database */
  301.                 &error_type);        /* error return */
  302.       c_detach();                            /* detach from console */
  303.       while(TRUE)                            /* loop */
  304.         { p_delay(1800);                 /* delay 30 seconds */
  305.         }
  306.     }
  307. /* NOTE: DATABASE.EXE is made up of database.c and system.c */
  308.  
  309.  
  310.  
  311. [LISTING FOUR]
  312.  
  313. /* file name: dbsuport.c */
  314.  
  315. #include <stdio.h>
  316. #include "queues.h"
  317.  
  318. /*=====================*/
  319. /* function prototypes */
  320. /*=====================*/
  321. void dbopen(void);
  322. unsigned int dbread(int index);
  323. void dbwrit(int index, unsigned int value);
  324. unsigned int far *open_dbase(void);
  325.  
  326. /*==============================*/
  327. /* external function prototypes */
  328. /*==============================*/
  329. extern int q_open(struct q_parameter_blk *param_blk_ptr,
  330.        char que_name[8],
  331.        int *err_ptr);
  332. extern void p_dispatch(void);
  333. extern int q_read(struct q_parameter_blk *param_blk_ptr,
  334.           unsigned char *buff_ptr,
  335.           int *err_ptr);
  336. extern int q_write(struct q_parameter_blk *param_blk_ptr,
  337.            unsigned char *buff_ptr,
  338.            int *err_ptr);
  339.  
  340. /*================*/
  341. /* global storage */
  342. /*================*/
  343. unsigned int far *dbase_ptr;                    /* pointer to database */
  344.  
  345. /*===============*/
  346. /* local defines */
  347. /*===============*/
  348. #define FAILURE         1
  349. #define SUCCESS         0
  350.  
  351. /*======================*/
  352. /* function definitions */
  353. /*======================*/
  354. void dbopen()
  355.    { dbase_ptr = NULL;                             /* initialize pointer */
  356.      while(dbase_ptr == NULL)                   /* loop while still NULL */
  357.     { dbase_ptr = open_dbase();             /* call open database */
  358.     }
  359.    }
  360. void dbwrit(int index, unsigned int value)
  361.     { *(dbase_ptr + index) = value;        /* write value to database */
  362.     }
  363. unsigned int dbread(int index)
  364.     { return(*(dbase_ptr + index));        /* return value at index */
  365.     }
  366. unsigned int far *open_dbase()
  367.    { struct q_parameter_blk dbase_parameters;   /* parameter block */
  368.      int result;                                /* result of q_make */
  369.      int error_type;                            /* cdos return code */
  370.      union base
  371.     { unsigned int far *base_ptr;
  372.       unsigned char base[sizeof(unsigned int far *)];
  373.     }base_union;                            /* composite pointer */
  374.      result = FAILURE;                          /* preset the variable */
  375.      while(result != SUCCESS)                   /* loop til we can open */
  376.     { result = q_open(&dbase_parameters,    /* pointer to param block */
  377.               "database",           /* queue name */
  378.               &error_type);         /* error type return */
  379.       p_dispatch();                         /* let someone else run */
  380.     }
  381.      result = q_read(&dbase_parameters,         /* read the dbase_queue */
  382.              &base_union.base[0],       /* msg read is in union */
  383.              &error_type);              /* error return type */
  384.      result = q_write(&dbase_parameters,        /* write to dbase_queue */
  385.               &base_union.base[0],      /* msg sent is pointer */
  386.               &error_type);             /* error return type */
  387.      return(base_union.base_ptr);               /* return the pointer */
  388.    }
  389.  
  390.  
  391.  
  392.  
  393. [LISTING FIVE]
  394.  
  395. /* file name ioboard.c */
  396.  
  397. #include <conio.h>
  398.  
  399. /*====================*/
  400. /* function prototype */
  401. /*====================*/
  402. void main(void);
  403.  
  404. /*==============================*/
  405. /* external function prototypes */
  406. /*==============================*/
  407. extern void dbopen(void);
  408. extern void dbwrit(int index, unsigned int value);
  409. extern unsigned int dbread(int index);
  410. extern unsigned int c_detach(void);
  411. extern void p_priority(unsigned char data);
  412. extern void p_delay(unsigned int del);
  413.  
  414. /*===============*/
  415. /* local defines */
  416. /*===============*/
  417. #define INPUT_BASE_ADDR  0x300                  /* hardware input address */
  418. #define OUTPUT_BASE_ADDR 0x300                  /* hardware output address */
  419. #define DBASE_WRITE_ADDR 0                      /* database write location */
  420. #define DBASE_READ_ADDR  1                      /* database read location */
  421. #define TRUE             1
  422.  
  423. /*=====================*/
  424. /* function definition */
  425. /*=====================*/
  426. void main()
  427.    { unsigned int temp_data;                    /* for reading database */
  428.      p_priority(199);                           /* set priority */
  429.      dbopen();                                  /* link to database */
  430.      c_detach();                                /* detach from console */
  431.      while(TRUE)
  432.     { temp_data = inp(INPUT_BASE_ADDR);     /* read data from port */
  433.       dbwrit(DBASE_WRITE_ADDR, temp_data);  /* write to the database */
  434.       temp_data = dbread(DBASE_READ_ADDR);  /* read data from database */
  435.       outp(OUTPUT_BASE_ADDR+3, temp_data);  /* write to output port */
  436.       p_delay(3);                           /* delay for 50 ms */
  437.     }
  438.    }
  439.  
  440. /* NOTE: IOBOARD.EXE is made up of ioboard.c, system.c, and dbsuport.c */
  441.  
  442.  
  443.  
  444. [LISTING SIX]
  445.  
  446. /* file name logic.c */
  447.  
  448. /*====================*/
  449. /* function prototype */
  450. /*====================*/
  451. void main(void);
  452.  
  453. /*==============================*/
  454. /* external function prototypes */
  455. /*==============================*/
  456. extern void dbopen(void);
  457. extern unsigned int dbread(int index);
  458. extern void dbwrit(int index, unsigned int value);
  459. extern unsigned int c_detach(void);
  460. extern void p_dispatch(void);
  461.  
  462. /*===============*/
  463. /* local defines */
  464. /*===============*/
  465. #define DATA_IN  0                      /* data written by I/O process */
  466. #define DATA_OUT 1                      /* data read by I/O process */
  467. #define TRUE     1
  468.  
  469. /*=====================*/
  470. /* function definition */
  471. /*=====================*/
  472. void main()
  473.    { static unsigned int last_data_read;        /* old data retainer */
  474.      unsigned int temp_data;                    /* for reading database */
  475.  
  476.      dbopen();                                  /* link to database */
  477.      c_detach();                                /* detach from console */
  478.      while(TRUE)                                /* continuous loop */
  479.     { temp_data = dbread(DATA_IN);          /* read input data */
  480.       if(temp_data ^ last_data_read)        /* if there was a change */
  481.          { dbwrit(DATA_OUT, ~temp_data);    /* write the to the port */
  482.            last_data_read = temp_data;      /* save the new value */
  483.          }
  484.       p_dispatch();                         /* let another process run */
  485.     }
  486.    }
  487. /* NOTE: LOGIC.EXE is made up of logic.c, system.c, and dbsuport.c */
  488.  
  489.  
  490.  
  491.